home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
fish
/
001-100
/
076-100
/
092
/
ndir
/
ndir.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-18
|
2KB
|
100 lines
/*
* ndir - routines to simulate the 4BSD new directory code for AmigaDOS.
*/
#include <dir.h>
DIR *
opendir(dirname) char *dirname; {
register DIR *my_dir, *AllocMem(int, int) ;
struct FileLock *Lock(char *, int), *CurrentDir(struct FileLock *) ;
if ((my_dir = AllocMem(sizeof(DIR), 0)) == NULL) return NULL ;
if (((my_dir -> d_lock = Lock(dirname, ACCESS_READ)) == NULL)
/* If we can't examine it */
|| !Examine(my_dir -> d_lock, &(my_dir -> d_info))
/* Or it's not a directory */
|| (my_dir -> d_info . fib_DirEntryType < 0)) {
FreeMem(my_dir, sizeof(DIR)) ;
return NULL ;
}
return my_dir ;
}
struct direct *
readdir(my_dir) DIR *my_dir; {
static struct direct result ;
if (!ExNext(my_dir -> d_lock, &(my_dir -> d_info))) return NULL ;
result . d_reclen = result . d_ino = 1 ; /* Not NULL! */
(void) strcpy(result . d_name, my_dir -> d_info . fib_FileName) ;
result . d_namlen = strlen(result . d_name) ;
return &result ;
}
void
closedir(my_dir) DIR *my_dir; {
UnLock(my_dir -> d_lock) ;
FreeMem(my_dir, sizeof(DIR)) ;
}
/*
* telldir and seekdir don't work quite right. The problem is that you have
* to save more than a long's worth of stuff to indicate position, and it's
* socially unacceptable to alloc stuff that you don't free later under
* AmigaDOS. So we fake it - you get one level of seek, and dat's all.
* As of now, these things are untested.
*/
#define DIR_SEEK_RETURN ((long) 1) /* Not 0! */
long
telldir(my_dir) DIR *my_dir; {
my_dir -> d_seek = my_dir -> d_info ;
return (long) DIR_SEEK_RETURN ;
}
void
seekdir(my_dir, where) DIR *my_dir; long where; {
if (where == DIR_SEEK_RETURN)
my_dir -> d_info = my_dir -> d_seek ;
else /* Makes the next readdir fail */
setmem((char *) my_dir, sizeof(DIR), 0) ;
}
void
rewinddir(my_dir) DIR *my_dir; {
if (!Examine(my_dir -> d_lock, &(my_dir -> d_info)))
setmem((char *) my_dir, sizeof(DIR), 0) ;
}
#ifdef TEST
/*
* Simple code to list the files in the argument directory,
* lifted straight from the man page.
*/
#include <stdio.h>
void
main(argc, argv) int argc; char **argv; {
register DIR *dirp ;
register struct direct *dp ;
register char *name ;
if (argc < 2) name = "" ;
else name = argv[1] ;
if ((dirp = opendir(name)) == NULL) {
fprintf(stderr, "Bogus! Can't opendir %s\n", name) ;
exit(1) ;
}
for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
printf("%s ", dp -> d_name) ;
closedir(dirp);
putchar('\n') ;
}
#endif TEST